package com.it.travel.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.it.travel.dao.FavoriteDao;
import com.it.travel.dao.RouteDao;
import com.it.travel.pojo.Favorite;
import com.it.travel.pojo.Route;
import com.it.travel.pojo.User;
import com.it.travel.service.RouteService;
import com.it.travel.vo.PageBean;
import com.it.travel.vo.ResultInfo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.context.request.RequestAttributes;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import java.util.HashMap;
import java.util.List;

@Service("routeService")
@Transactional(propagation = Propagation.SUPPORTS,readOnly = true)//适用于查询场景
public class RouteServiceImpl implements RouteService {

    @Autowired
    private RouteDao routeDao;

    @Autowired
    private FavoriteDao favoriteDao;

    /**
     * 精选人气，最新，主题
     * @return
     */
    @Override
    public ResultInfo routeCareChoose() {
        //获取人气前四
        PageHelper.startPage(1,4);
        List<Route> popularities= routeDao.queryPopularity();

        //获取最新前四
        PageHelper.startPage(1,4);
        List<Route> news = routeDao.queryNews();

        //获取主题前四
        PageHelper.startPage(1,4);
        List<Route> themes = routeDao.queryThemes();

        HashMap<String, List<Route>> map = new HashMap<>();
        map.put("popularity",popularities);
        map.put("news",news);
        map.put("themes",themes);
        return new ResultInfo(true,map,null);
    }

    /**
     * 搜索实现
     * @param cid
     * @param rname
     * @param curPage
     * @return
     */
    @Override
    public ResultInfo findRouteList(Integer cid, String rname, Integer curPage) {
        //利用分页工具类 指定当前页面和页面显示数据条数
        PageHelper.startPage(curPage,8);
        //调用routeDao方法取数据库查询数据
        List<Route> list = routeDao.findRouteList(cid, rname);
        //判断从数据库查询的数据是否为空
        if (CollectionUtils.isEmpty(list)) {
            return new ResultInfo(false,"数据为空");
        }
        //创建分页数据类对象
        PageInfo<Route> pageInfo = new PageInfo<>(list);
        //利用自己创建的PageBean<T>传递需要的数据
        PageBean<Route> pageBean = new PageBean<>();
        //设置当前页列表
        pageBean.setData(list);
        //设置总记录数
        pageBean.setCount(pageInfo.getTotal());
        //设置当前页
        pageBean.setCurPage(pageInfo.getPageNum());
        //设置首页
        pageBean.setFirstPage(pageInfo.getNavigateFirstPage());
        //设置下一页
        pageBean.setNextPage(pageInfo.getNextPage());
        //设置上一页
        pageBean.setPrePage(pageInfo.getPrePage());
        //设置总页数
        pageBean.setTotalPage(pageInfo.getPages());

        //封装数据到pageBean里返回
        return new ResultInfo(true,pageBean,null);
    }


    /**
     * 查看详情
     * @param rid
     * @return
     */
    @Override
    public ResultInfo findRouteByRid(Integer rid) {
        Route route = routeDao.findRouteByRid(rid);
        if (route==null) {
            return new ResultInfo(false, "当前旅游路线不存在");
        }
        return new ResultInfo(true,route,null);
    }


    /**
     * 点击收藏功能实现
     * @param rid
     * @return
     */
    @Override
    @Transactional(propagation = Propagation.REQUIRED,readOnly = false)
    public ResultInfo addFavorite(Integer rid) {
//        用户发送路线ID到后台后，进行如下判断：
//        1.从session中获取用户信息，判断是否为空
        RequestAttributes requestAttributes = RequestContextHolder.currentRequestAttributes();
        ServletRequestAttributes attributes=(ServletRequestAttributes)requestAttributes;
        User user = (User) attributes.getRequest().getSession().getAttribute("user");
        if (user == null) {
//        1.1 session中用户信息为null，用户未的登录，响应数据：flag:true,data:0；
            return new ResultInfo(true,0,null);
        }
        try {
//        1.2 不为null，则进行下一步操作；
//        2.更新旅游路线收藏数量+1,返回update受影响行数；
            Integer routeCount = routeDao.updateFavoriteCount(rid, 1);
//        3.收藏表添加用户信息、旅游路线信息，完成收藏功能,同时返回insert影响的行数；
            Integer favoriteCount = favoriteDao.addFavorite(rid,user.getUid());
            //查询最新收藏数
            Route route = routeDao.queryCounts(rid);
//        影响行数大于0，则查询最新收藏数量返回给前端：flag：true,data:最新收藏数；
            return new ResultInfo(true, route.getCount(), null);
        } catch (Exception e) {
            e.printStackTrace();
//        否则，返回收藏失败信息：flag:false,msg:收藏失败；
            return new ResultInfo(false, "收藏失败");
        }
//        5.上述操作保证事务一致性；

    }

    /**
     * 线路排行榜展示功能
     * @param curPage 当前页
     * @param rname 模糊查询路线名
     * @param startPrice 最低价格
     * @param endPrice 最高价格
     * @return
     */
    @Override
    public ResultInfo findRoutesFavoriteRank(Integer curPage, String rname, Double startPrice, Double endPrice) {
        //配置分页当前页面和页面显示条数
        PageHelper.startPage(curPage, 8);
        //调用routeDao调用查询功能
        List<Route> routeList = routeDao.findRoutesFavoriteRank(rname, startPrice, endPrice);
        if (routeList == null) {
            //如果查询的内容为空
            return new ResultInfo(false, "收藏排行榜数据查询失败");
        }

        PageInfo<Route> routePageInfo = new PageInfo<>(routeList);

        PageBean<Route> routePageBean = new PageBean<>();

        routePageBean.setTotalPage(routePageInfo.getPages());
        routePageBean.setPrePage(routePageInfo.getPrePage());
        routePageBean.setNextPage(routePageInfo.getNextPage());
        routePageBean.setFirstPage(routePageInfo.getNavigateFirstPage());
        routePageBean.setCurPage(routePageInfo.getPageNum());
        routePageBean.setData(routePageInfo.getList());
        routePageBean.setCount(routePageInfo.getTotal());

        return new ResultInfo(true, routePageBean, null);
    }
}
